package business.database.maesorg;


import java.util.HashMap;

import groovy.sql.Sql;
import org.apache.log4j.Logger;


/**
 * Factoria abstracta para los DAO de sqlite
 * @author Administrador
 *
 */
public class AbsMaesorgDAOFactory {

	private static AbsMaesorgDAOFactory _instance;
	/**
	* Objeto para bloquear y permitir un singleton threadsafe
	*/
	private static Object syncObject_ = new Object();
	private Logger _log;
	/**
	* Este es el objeto que se encarga de acceder a la base de datos SQLite
	*/
   private HashMap<Integer,Sql> sqlmaesorgPool;
	
	/**
	 * TODO: hacer thread safe
	 * @return instancia unica
	 */
	public static AbsMaesorgDAOFactory getInstance() {
		if (_instance == null) {
			
						  synchronized(syncObject_) {
			
							if (_instance == null) {
							   _instance = new AbsMaesorgDAOFactory();
							}
			
						  }
			
						}
						return _instance;
	}
	
	private AbsMaesorgDAOFactory() {
		_log = Logger.getLogger("AbsMaesorgDAOFactory");
		sqlmaesorgPool = new HashMap<Long,Sql>();
	}
	
 /**
   * Cambia la ruta de la base de datos de maesorg
   * @param path
   */
  public boolean setDB(Integer id, String path) {
	  
	 boolean ok = false
	 
	   def f = new File(path)
	   ok = f.exists()
	   if (ok) {
		   close(id)
		   if (!sqlmaesorgPool.containsKey(id)) {
			   Sql sqlmaesorg = Sql.newInstance("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + path, "",
				   "", "sun.jdbc.odbc.JdbcOdbcDriver") 
		   	   sqlmaesorgPool.put(id,sqlmaesorg);
		   }
		  }
	   else _log.error "La ruta de Maesorg: ${path}, es incorrecta"
	   
	   return ok
  }
	/**
 * Cierra SQLMaesorg
 */
  void close(Integer id) {
	 try {
		 if (sqlmaesorgPool.containsKey(id)) {
			 sqlmaesorgPool.get(id).close();
			 sqlmaesorgPool.remove(id);
		 }
	 } catch (Exception e) {
	 	_log.error "Error al cerrar sqlMaesorg. ${e.getMessage()}"
	 }
 }
  
  /**
  * Cierra todas las conexiones que hayan podido quedar
  */
 public void closeAll() {
	 sqlmaesorgPool.keySet().each { id ->
		 try {
			  sqlmaesorgPool.get(id).close();
			 
		 } catch (Exception e) {
			 
		 }
	 }
	 _instance = null;
 }
 
	/**
	* Inicia transaccion en sqlite
	*/
	 public void startTransaction(Integer id) { sqlmaesorgPool.get(id).execute("BEGIN TRANSACTION");}
	 
	
	
	 
	 /**
	  * finaliza transaccion en sqlite. Equivalente a hacer un COMMIT
	  */
	 public void endTransaction(Integer id) { sqlmaesorgPool.get(id).execute("END TRANSACTION");}
	 /**
	  * Hace un rollback sobre la transaccion abierta
	  */
	 public void rollback(Integer id) { sqlmaesorgPool.get(id).execute("ROLLBACK TRANSACTION");}
	 
	public MaesorgUtils getMaesorgUtils(Integer id) {
		return new MaesorgUtils(sqlmaesorgPool.get(id));
	}
	
	
		
	
}
